package handlers

import (
	"log"
	"time"

	"gitee.com/zhenyangze/gin-framework/internal/app/providers"
	"gitee.com/zhenyangze/gin-framework/pkg/helpers"
)

// 数据库清理任务
func DatabaseCleanupJob() {
	log.Printf("开始数据库清理任务: %s", helpers.GetCurrentDate())
	
	if providers.DB == nil {
		log.Println("数据库连接不可用，跳过清理任务")
		return
	}
	
	// 清理30天前的日志记录
	result := providers.DB.Exec("DELETE FROM logs WHERE created_at < ?", time.Now().AddDate(0, 0, -30))
	if result.Error != nil {
		log.Printf("数据库清理失败: %v", result.Error)
		return
	}
	
	log.Printf("数据库清理完成，删除了 %d 条记录", result.RowsAffected)
}

// 缓存清理任务
func CacheCleanupJob() {
	log.Printf("开始缓存清理任务: %s", helpers.GetCurrentDate())
	
	if providers.Redis == nil {
		log.Println("Redis连接不可用，跳过缓存清理")
		return
	}
	
	// 清理过期的缓存键
	keys, err := providers.Redis.Keys("temp:*").Result()
	if err != nil {
		log.Printf("获取缓存键失败: %v", err)
		return
	}
	
	for _, key := range keys {
		providers.Redis.Del(key)
	}
	
	log.Printf("缓存清理完成，清理了 %d 个键", len(keys))
}

// 统计报表任务
func StatisticsReportJob() {
	log.Printf("开始生成统计报表: %s", helpers.GetCurrentDate())
	
	if providers.DB == nil {
		log.Println("数据库连接不可用，跳过统计任务")
		return
	}
	
	// 生成用户统计
	var userCount int64
	providers.DB.Table("users").Count(&userCount)
	
	// 生成访问统计
	var logCount int64
	providers.DB.Table("logs").Where("created_at >= ?", time.Now().AddDate(0, 0, -1)).Count(&logCount)
	
	log.Printf("统计报表生成完成 - 用户数: %d, 昨日访问: %d", userCount, logCount)
	
	// 这里可以发送邮件报表或保存到文件
}

// 系统健康检查任务
func HealthCheckJob() {
	log.Printf("开始系统健康检查: %s", helpers.GetCurrentDate())
	
	// 检查数据库连接
	if providers.DB != nil {
		sqlDB, err := providers.DB.DB()
		if err == nil {
			if err := sqlDB.Ping(); err != nil {
				log.Printf("数据库连接异常: %v", err)
			} else {
				log.Println("数据库连接正常")
			}
		}
	}
	
	// 检查Redis连接
	if providers.Redis != nil {
		if err := providers.Redis.Ping().Err(); err != nil {
			log.Printf("Redis连接异常: %v", err)
		} else {
			log.Println("Redis连接正常")
		}
	}
	
	log.Println("系统健康检查完成")
}

// 文件清理任务
func FileCleanupJob() {
	log.Printf("开始文件清理任务: %s", helpers.GetCurrentDate())
	
	// 清理日志文件 (保留最近7天)
	logDir := "runtime/logs/"
	if helpers.IsDir(logDir) {
		// 这里可以添加具体的文件清理逻辑
		log.Println("执行日志文件清理...")
	}
	
	// 清理临时文件
	tmpDir := "tmp/"
	if helpers.IsDir(tmpDir) {
		log.Println("执行临时文件清理...")
	}
	
	log.Println("文件清理任务完成")
}